From f478f16dbad1da98f812edf5a96e09e140ba36bb Mon Sep 17 00:00:00 2001 From: Chris Cummins Date: Fri, 5 Apr 2013 10:54:03 +0100 Subject: [PATCH] cds: enable outset shadows Adds conditional code paths to GdkCssShadowValue for painting outset shadows, and allows shadows to be applied in two passes (first outset then inset). This can be used to draw csd shadows in outer window borders. https://bugzilla.gnome.org/show_bug.cgi?id=695998 Signed-off-by: Rob Bradford --- gtk/gtkcssshadowsvalue.c | 6 ++++-- gtk/gtkcssshadowsvalueprivate.h | 3 ++- gtk/gtkcssshadowvalue.c | 23 +++++++++++++++++++---- gtk/gtkcssshadowvalueprivate.h | 2 ++ gtk/gtkthemingbackground.c | 10 +++++++--- 5 files changed, 34 insertions(+), 10 deletions(-) diff --git a/gtk/gtkcssshadowsvalue.c b/gtk/gtkcssshadowsvalue.c index 0438316935..a71f4fe08f 100644 --- a/gtk/gtkcssshadowsvalue.c +++ b/gtk/gtkcssshadowsvalue.c @@ -287,7 +287,8 @@ _gtk_css_shadows_value_paint_spinner (const GtkCssValue *shadows, void _gtk_css_shadows_value_paint_box (const GtkCssValue *shadows, cairo_t *cr, - const GtkRoundedBox *padding_box) + const GtkRoundedBox *padding_box, + gboolean inset) { guint i; @@ -295,6 +296,7 @@ _gtk_css_shadows_value_paint_box (const GtkCssValue *shadows, for (i = 0; i < shadows->len; i++) { - _gtk_css_shadow_value_paint_box (shadows->values[i], cr, padding_box); + if (inset == _gtk_css_shadow_value_get_inset (shadows->values[i])) + _gtk_css_shadow_value_paint_box (shadows->values[i], cr, padding_box); } } diff --git a/gtk/gtkcssshadowsvalueprivate.h b/gtk/gtkcssshadowsvalueprivate.h index f77b22319a..7ee619e8de 100644 --- a/gtk/gtkcssshadowsvalueprivate.h +++ b/gtk/gtkcssshadowsvalueprivate.h @@ -46,7 +46,8 @@ void _gtk_css_shadows_value_paint_spinner (const GtkCssValue gdouble progress); void _gtk_css_shadows_value_paint_box (const GtkCssValue *shadows, cairo_t *cr, - const GtkRoundedBox *padding_box); + const GtkRoundedBox *padding_box, + gboolean inset); G_END_DECLS diff --git a/gtk/gtkcssshadowvalue.c b/gtk/gtkcssshadowvalue.c index 618288807a..6e61cab426 100644 --- a/gtk/gtkcssshadowvalue.c +++ b/gtk/gtkcssshadowvalue.c @@ -445,6 +445,14 @@ _gtk_css_shadow_value_paint_spinner (const GtkCssValue *shadow, cairo_restore (cr); } +gboolean +_gtk_css_shadow_value_get_inset (const GtkCssValue *shadow) +{ + g_return_val_if_fail (shadow->class == >K_CSS_VALUE_SHADOW, FALSE); + + return shadow->inset; +} + void _gtk_css_shadow_value_paint_box (const GtkCssValue *shadow, cairo_t *cr, @@ -457,15 +465,21 @@ _gtk_css_shadow_value_paint_box (const GtkCssValue *shadow, cairo_save (cr); - _gtk_rounded_box_path (padding_box, cr); - cairo_clip (cr); + if (shadow->inset) + { + _gtk_rounded_box_path (padding_box, cr); + cairo_clip (cr); + } box = *padding_box; _gtk_rounded_box_move (&box, _gtk_css_number_value_get (shadow->hoffset, 0), _gtk_css_number_value_get (shadow->voffset, 0)); spread = _gtk_css_number_value_get (shadow->spread, 0); - _gtk_rounded_box_shrink (&box, spread, spread, spread, spread); + if (shadow->inset) + _gtk_rounded_box_shrink (&box, spread, spread, spread, spread); + else /* Outset */ + _gtk_rounded_box_grow (&box, spread, spread, spread, spread); clip_box = *padding_box; radius = _gtk_css_number_value_get (shadow->radius, 0); @@ -475,7 +489,8 @@ _gtk_css_shadow_value_paint_box (const GtkCssValue *shadow, cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD); _gtk_rounded_box_path (&box, cr); - _gtk_rounded_box_clip_path (&clip_box, cr); + if (shadow->inset) + _gtk_rounded_box_clip_path (&clip_box, cr); gdk_cairo_set_source_rgba (cr, _gtk_css_rgba_value_get_rgba (shadow->color)); cairo_fill (cr); diff --git a/gtk/gtkcssshadowvalueprivate.h b/gtk/gtkcssshadowvalueprivate.h index 98efa67ab4..0688fc3301 100644 --- a/gtk/gtkcssshadowvalueprivate.h +++ b/gtk/gtkcssshadowvalueprivate.h @@ -34,6 +34,8 @@ GtkCssValue * _gtk_css_shadow_value_new_for_transition (GtkCssValue GtkCssValue * _gtk_css_shadow_value_parse (GtkCssParser *parser); +gboolean _gtk_css_shadow_value_get_inset (const GtkCssValue *shadow); + void _gtk_css_shadow_value_paint_layout (const GtkCssValue *shadow, cairo_t *cr, PangoLayout *layout); diff --git a/gtk/gtkthemingbackground.c b/gtk/gtkthemingbackground.c index 579d2be4de..706752b082 100644 --- a/gtk/gtkthemingbackground.c +++ b/gtk/gtkthemingbackground.c @@ -265,11 +265,13 @@ _gtk_theming_background_paint_layer (GtkThemingBackground *bg, static void _gtk_theming_background_apply_shadow (GtkThemingBackground *bg, - cairo_t *cr) + cairo_t *cr, + gboolean inset) { _gtk_css_shadows_value_paint_box (_gtk_style_context_peek_property (bg->context, GTK_CSS_PROPERTY_BOX_SHADOW), cr, - &bg->padding_box); + &bg->padding_box, + inset); } static void @@ -358,6 +360,8 @@ _gtk_theming_background_render (GtkThemingBackground *bg, cairo_save (cr); cairo_translate (cr, bg->paint_area.x, bg->paint_area.y); + _gtk_theming_background_apply_shadow (bg, cr, FALSE); /* Outset shadow */ + _gtk_theming_background_paint_color (bg, cr, background_image); for (idx = _gtk_css_array_value_get_n_values (background_image) - 1; idx >= 0; idx--) @@ -365,7 +369,7 @@ _gtk_theming_background_render (GtkThemingBackground *bg, _gtk_theming_background_paint_layer (bg, idx, cr); } - _gtk_theming_background_apply_shadow (bg, cr); + _gtk_theming_background_apply_shadow (bg, cr, TRUE); /* Inset shadow */ cairo_restore (cr); } -- 2.30.2